#include<iostream>
#include<map>
#include<vector>
#include<string>
#include<set>
#include<fstream>
#include<sstream>
using std::cout;
using std::endl;
using std::map;
using std::set;
using std::ifstream;
using std::ofstream;
using std::string;
using std::vector;
using std::istringstream;

class TextQuery{
public:
    void read(const string&filename);
    void readLine(const string&line,int&idx);//阅读单词的
    void readWorldLine(const string&word,int idx);
    void query(const string & word);//查阅单词


    //查阅两个单词 然后set一下
    //都出现
    void checkWord(const string&word1,const string&word2);

    //查阅到具体某行
    //lidx 查阅的行号
    void checkwordLine(const string&word1,const string&word2,const int&lidx);


private:
    map<string,set<int>> wordLine;
    map<string,int> _dic;
    vector<string> _line;//动态数组，行号就是坐标号
};

//记录行
void TextQuery::read(const string&filename){
    int id = 0;  //记录个数
    string line; //记录语句
    ifstream ifs(filename);
    if(!ifs.good()){
        cout<<"ifs open file fail!"<<endl;
        return;
    }
    while(std::getline(ifs,line)){
        id++;
        _line.push_back(line);
        readLine(line,id);
    }
}
//记录单词个数
//读单词的时候，就要记录行数  
void TextQuery::readLine(const string&line,int&idx){
    string world;
    istringstream iss(line);
    string word;//准备好记录
    while(iss>>world){
        if(ispunct(world.back())){
            //移除尾部标点符号
                world.erase(world.find(world.back()));
            }
        if(ispunct(world.front())){
            //移除头部标点符号
            world.erase(world.find(world.front()));
        }
        //大小写转换
        if(isupper(world[0])){
            world[0] = tolower(world[0]);
        }

        //如过该单词出现过，就不统计
        bool isExit = false;
        //该行出现过哈 一会儿要改
        for(auto &ele : _dic){
            if(world == ele.first){
                //出现过
                isExit = true;
                ++ele.second;
                break;
            }
        }
        if(isExit!=true){
            _dic.insert({world,1});
        }
        readWorldLine(world,idx);
    }
}

void TextQuery::readWorldLine(const string&word,int idx){
    set<int> lineidx;
    for(auto &it : wordLine){
        if(word == it.first){
            it.second.insert(idx);
            break;
        }
    }
    //没有的情况下
    lineidx.insert(idx);
    wordLine.insert({word,lineidx});
}

void TextQuery::query(const string & word){
    //找单词 找单词的频率
    for(auto &ww:_dic){
        if(word == ww.first){
            cout<<ww.first<<":  "<<ww.second<<endl;
        }
    }
    //记录行号
    for(auto &wl:wordLine){
        if(word == wl.first){
            //遍历行号
            for(auto &lidx : wl.second){
                cout<<"line = "<<lidx<<endl;
                //去vector 找lidx
                cout<<_line[lidx-1]<<endl;
            }
        }
    }
}

void TextQuery::checkWord(const string&word1,const string&word2){
    set<int> lines;
    //返回的是wordLine.second
    auto it = wordLine.find(word1);
    auto it2 = wordLine.find(word2);
    for(auto &ln:it->second){
        for(auto &ln1:it2->second){
            if(ln == ln1){
                //行数相同
                lines.insert(ln);
            }
        }
    }
    cout<<word1<<" "<<word2<<"共同出现的行数: "; 
    for(auto &ln:lines){
        cout<<ln<<" ";
    }
    cout<<endl;
}

//针对一行进行操作
void TextQuery::checkwordLine(const string&word1,const string&word2,const int&lidx){
    // -1 没有出现
    //  0 出现一个
    //  1 都出现
    int lid1 = 0;
    int lid2 = 0;
    for(auto &it : wordLine.find(word1)->second){
        if(lidx == it){
            lid1++;
            break;
        }
    }
    for(auto &it : wordLine.find(word2)->second){
        if(lidx == it){
            lid2++;
            break;
        }
    }
    if((lid1||lid2)){
        if(lid1&&lid2){
            cout<<"两个单词都出现了"<<endl;
        }
        else if(lid1||lid2){
            cout<<"至少单词出现了一个"<<endl;
        }
    }
    else{
        cout<<"都没有出现"<<endl;
    }

}

int main(void){

    TextQuery Text;
    Text.read("china_daily.txt");
    Text.query("link");
    Text.checkwordLine("the","link",1);
}